package cn.drenal.capcap.controller;

import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.drenal.capcap.common.Response;
import cn.drenal.capcap.entity.SysRole;
import cn.drenal.capcap.entity.dto.RoleDTO;
import cn.drenal.capcap.entity.dto.RolePermissionDTO;
import cn.drenal.capcap.service.SysRoleService;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import java.util.List;

/**
 * 角色管理控制器
 */
@RestController
@RequestMapping("/role")
@RequiredArgsConstructor
public class SysRoleController {

    private final SysRoleService sysRoleService;

    /**
     * 创建角色
     *
     * @param roleDTO 角色信息
     * @return 创建结果
     */
    @PostMapping
    @SaCheckPermission("system:role:add")
    public Response<SysRole> createRole(@RequestBody RoleDTO roleDTO) {
        return Response.success(sysRoleService.createRole(roleDTO));
    }

    /**
     * 更新角色
     *
     * @param id 角色ID
     * @param roleDTO 角色信息
     * @return 更新结果
     */
    @PutMapping("/{id}")
    @SaCheckPermission("system:role:edit")
    public Response<SysRole> updateRole(@PathVariable Long id, @RequestBody RoleDTO roleDTO) {
        return Response.success(sysRoleService.updateRole(id, roleDTO));
    }

    /**
     * 删除角色
     *
     * @param id 角色ID
     * @return 删除结果
     */
    @DeleteMapping("/{id}")
    @SaCheckPermission("system:role:delete")
    public Response<Void> deleteRole(@PathVariable Long id) {
        sysRoleService.deleteRole(id);
        return Response.success();
    }

    /**
     * 获取角色列表
     *
     * @param current 当前页
     * @param size 每页大小
     * @param name 角色名称（模糊查询）
     * @param code 角色编码（模糊查询）
     * @return 角色列表
     */
    @GetMapping("/list")
    @SaCheckPermission("system:role:list")
    public Response<Page<SysRole>> getRoleList(
            @RequestParam(defaultValue = "1") long current,
            @RequestParam(defaultValue = "10") long size,
            @RequestParam(required = false) String name,
            @RequestParam(required = false) String code) {
        Page<SysRole> page = new Page<>(current, size);
        return Response.success(sysRoleService.getRoleList(page, name, code));
    }

    /**
     * 获取所有角色
     *
     * @return 所有角色列表
     */
    @GetMapping("/all")
    public Response<List<SysRole>> getAllRoles() {
        return Response.success(sysRoleService.getAllRoles());
    }
    
    /**
     * 获取所有角色的简单列表（用于下拉选择）
     *
     * @return 角色简单列表（id和name）
     */
    @GetMapping("/options")
    public Response<List<Map<String, Object>>> getRoleOptions() {
        List<SysRole> roles = sysRoleService.getAllRoles();
        List<Map<String, Object>> options = roles.stream().map(role -> {
            Map<String, Object> option = new HashMap<>();
            option.put("id", role.getId());
            option.put("name", role.getName());
            option.put("code", role.getCode());
            return option;
        }).collect(Collectors.toList());
        return Response.success(options);
    }

    /**
     * 获取角色详情
     *
     * @param id 角色ID
     * @return 角色详情
     */
    @GetMapping("/{id}")
    @SaCheckPermission("system:role:query")
    public Response<SysRole> getRoleById(@PathVariable Long id) {
        return Response.success(sysRoleService.getRoleById(id));
    }

    /**
     * 分配角色权限
     *
     * @param rolePermissionDTO 角色权限信息
     * @return 分配结果
     */
    @PostMapping("/permission")
    @SaCheckPermission("system:role:permission")
    public Response<Void> assignRolePermission(@RequestBody RolePermissionDTO rolePermissionDTO) {
        sysRoleService.assignRolePermission(rolePermissionDTO);
        return Response.success();
    }

    /**
     * 获取角色权限ID列表
     *
     * @param roleId 角色ID
     * @return 权限ID列表
     */
    @GetMapping("/{roleId}/permissions")
    @SaCheckPermission("system:role:query")
    public Response<List<Long>> getRolePermissions(@PathVariable Long roleId) {
        return Response.success(sysRoleService.getRolePermissionIds(roleId));
    }
}